package com.etc.util;


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ResourceBundle;
import javax.sql.rowset.CachedRowSet;
import com.sun.rowset.CachedRowSetImpl;


/**
 * MySQL数据库工具类
 * 
 * @author Administrator
 *
 */
public class DBUtil {
	
	private static String driverClassName;
	private static String url;
	private static String username;
	private static String password;
	
	/**
	 * 读取db.properties配置文件中数据库连接信息
	 */
	private static void loadDBProperties() {
		ResourceBundle resourceBundle = ResourceBundle.getBundle("db"); // baseName - 资源包的基本名称，一个完全限定的类名
		driverClassName = resourceBundle.getString("jdbc.driverClassName");
		url = resourceBundle.getString("jdbc.url");
		username = resourceBundle.getString("jdbc.username");
		password = resourceBundle.getString("jdbc.password");
	}

	/**
	 * 类的初始化代码块(静态块)
	 * 类加载时执行loadDBProperties()方法,读取连接数据库信息
	 */
	static {
		loadDBProperties();
	}
	
	/**
	 * 返回一个数据库连接
	 * @return
	 */
	private static Connection getConnection() {
		Connection conn = null;

		try {
			// 1.加载驱动
			Class.forName(driverClassName);
			// 2.使用DriverManager创建数据库连接
			conn = DriverManager.getConnection(url, username, password);
			
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}

		return conn;
	}
	
	/**
	 * 释放资源
	 * @param rs
	 * @param pstat
	 * @param conn
	 */
	private static void closeAll(ResultSet rs, PreparedStatement pstat, Connection conn) {
		
		try {
			if (rs != null) {
				rs.close();
			}
			if (pstat != null) {
				pstat.close();
			}
			if (conn != null) {
				conn.close();
			}
		} catch (SQLException e1) {
			e1.printStackTrace();
		}
	}
	
	/**
	 * 专门用于执行SQL更新操作,包含insert update delete
	 * @param sql 执行的insert update delete SQL语句
	 * @param param SQL语句所需要的参数列表
	 * @return
	 */
	public static int update(String sql,Object... param) { 
	
		Connection conn = null;
		PreparedStatement pstat = null;
		int n = 0;
		
		try {
			// 连接数据库
			conn = getConnection();
			
			// 使用Connection连接对象创建预编译语句对象
			pstat = conn.prepareStatement(sql);
			
			// 通过for循环迭代可变参数数组,为?赋值
			for (int i = 0; i < param.length; i++) {
				pstat.setObject(i+1, param[i]);
			}
			
			// 执行SQL语句
			n = pstat.executeUpdate();
		} catch (SQLException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		} finally {
		    // 释放资源
			closeAll(null, pstat, conn);
		}
		// 返回执行结果
		return n;
				
	}
	
	/**
	 * 专门用于执行SQL查询操作,select
	 * @param sql
	 * @param param
	 * @return 返回缓存结果集
	 */
	public static ResultSet query(String sql, Object... param) {
		Connection conn = null;
		PreparedStatement pstat = null;
		ResultSet rs = null;
		CachedRowSet cachedRowSet = null;
		
		try {
			// 连接数据库
			conn = getConnection();
			
			// 使用Connection连接对象创建预编译语句对象
			pstat = conn.prepareStatement(sql);
			
			// 通过for循环迭代可变参数数组,为?赋值
			for (int i = 0; i < param.length; i++) {
				pstat.setObject(i+1, param[i]);
			}
			
			// 执行SQL语句
			rs = pstat.executeQuery();
			
			// 将结果集ResultSet中的数据存储到缓存结果集CachedRowSet中
			// 创建一个CachedRowSet的对象
			cachedRowSet = new CachedRowSetImpl();
			// void populate(ResultSet data) throws SQLException填充此CachedRowSet从给定数据对象ResultSet对象
			cachedRowSet.populate(rs);
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			// 释放释放
			closeAll(rs, pstat, conn);
		}
		
		// 返回缓存结果集
		return cachedRowSet;
	}
	

}
